package interfaces;

import board.Board;
import board.BoardEx;


/**
 * Interfejs, ktory powinnien byc implementowany przez klase "plansza" (pisana przez Wojciecha).
 * W tym interfejsie autorzy innych blokow powinni wpisac metody jakich oczekuja od planszy.
 * @author Kuba
 *
 */
public interface Data {
	/**
	 * Skoro Adam sie upiera ze nie musimy znac swoich porcji kodu, a ja jednak musze wiedziec jak mam
	 * wyswietlic plansze to najlepiej jak ja powiem jak to chce a ty mi to zalatwisz w tej metodzie. 
	 * Zwroc mi tablice NxN int-ow, z adresacja taka jaka ustalilismy na spotkaniu 
	 * (tj tab[0][0] to lewy gorny rog, [N-1][N-1] to prawy dolny, [0][N-1] to prawy gorny 
	 * a [N-1][0] lewy dolny). N to oczywiscie dlugosc boku kwadratu. Jako wartosci tablicy 
	 * maja sie pojawic wiadomo, wartosci elementu ktory znajduje sie w danym miejscu lub 0 dla pustego
	 * klocka. Czyli na przyklad dla ulozonego problemu 3x3 wysylasz mi tablice {{1,2,3},{4,5,6},{7,8,0}}
	 * @return Plansza, tak jak opisalem wyzej
	 */
	int[][] getInOrder();
	
	/**
	 * Dwie kolejne metody do sprawdzenia czy plansza ulozona
	 * @return true jezeli ulozona
	 */
	public boolean isDone();
	public boolean isDone(Board data);
	/**
	 * Sprawdza czy plansze sa takie same
	 * @param data plansza
	 * @return true jeĹĽeli takie same
	 */
	public boolean isTheSame(Board  data);
	public boolean isTheSame(Board data1, Board data2);
	/**
	 * Metoda do przesuwania
	 * BARDZO WAĹ»NE musi zwracaÄ‡nowy obiekt nie moĹĽe modyfikowaÄ‡ obecnego
	 * Jak Ĺşleprzesuwam to dajesz wyjÄ…tek ja i tak bÄ™dÄ™sprawdzaĹ‚ czy mogÄ™
	 * @param iterable_way no wiadomo kierunek
	 * @return Zwraca NOWY PRZESUNIÄ�TY obiekt
	 */
	public Board move(Board.Way iterable_way);
	/**
	 * Do sprawdzania czy mogÄ™przesunÄ…Ä‡
	 * @param iterable_way no wiadomo kierunek
	 * @return true jak mogÄ™przesunÄ…Ä‡
	 */
	public boolean canMove(Board.Way iterable_way);
	
	/**
	 * Zwraca wartosc z pozycji x, y
	 * @param x
	 * @param y
	 * @return wartosc
	 * zwraca wyjÄ…tek jak na pozycji nic nie ma
	 */
	public int getValue (int x, int y) throws BoardEx;
	/**
	 * Zwraca 
	 * @return szerokosc planszy. Domyslnie indeks ostatniego elemetu +1. Czyli opisane przez kube N
	 */
	public int getWidth();
	/**
	 * Zwraca 
	 * @return wysokosc planszy. Domyslnie indeks ostatniego elemetu +1. Czyli opisane przez kube N
	 */
	public int getHeight();

}

